package utils

import (
	"encoding/json"
	"os"
	"zinx/interfa"
	"zinx/utils/commandline/args"
	"zinx/utils/commandline/uflag"
	"zinx/zlog"
)

type GlobalObj struct {
	TCPServere interfa.IServer
	Host       string // 服务器IP
	TcpPort    int    // 服务器监听端口号
	Name       string // 服务器名称

	Version          string // zinx版本号
	MaxPacketSize    uint32 // 数据包最大值
	MaxConn          int    // 服务器主机最大连接个数
	WorkerPoolSize   uint32 // 业务工作worker数量
	MaxWorkerTaskLen uint32 //业务工作Worker对应负责的任务队列最大任务存储数量
	MaxMsgChanLen    uint32 // SendBufMsg消息缓冲最大长度

	ConfFilePath string

	// logger
	LogDir        string //日志所在文件夹 默认"./log"
	LogFile       string //日志文件名称   默认""  --如果没有设置日志文件，打印信息将打印至stderr
	LogDebugClose bool   //是否关闭Debug日志级别调试信息 默认false  -- 默认打开debug信息
}

var GlobalObject *GlobalObj

// 判断一个文件是否存在
func PathExists(path string) (bool, error) {
	_, err := os.Stat(path)
	if err == nil {
		return true, nil
	}
	if os.IsNotExist(err) {
		return false, nil
	}
	return false, err
}

func (g *GlobalObj) Reload() {
	if confFileExists, _ := PathExists(g.ConfFilePath); confFileExists != true {
		return
	}
	data, err := os.ReadFile(g.ConfFilePath)
	if err != nil {
		panic(err)
	}
	// 将json数据解析到struct中
	err = json.Unmarshal(data, g)
	if err != nil {
		panic(err)
	}

	// logger设置
	if g.LogFile != "" {
		zlog.SetLogFile(g.LogDir, g.LogFile)
	}
	if g.LogDebugClose == true {
		zlog.CloseDebug()
	}
}

// 默认加载
func init() {
	pwd, err := os.Getwd()
	if err != nil {
		pwd = "."
	}
	// 初始化配置文件标志
	args.InitConfigFlag(pwd+"/conf/zin.json", "配置文件，若没配置，默认为/conf/zinx.json")
	// 解析命令行标志
	uflag.Parse()
	// 处理配置文件路径
	args.FLagHandle()
	GlobalObject = &GlobalObj{
		Name:             "ServerApp",
		Version:          "V0.4",
		TcpPort:          8080,
		Host:             "0.0.0.0",
		MaxConn:          12000,
		MaxPacketSize:    4096,
		ConfFilePath:     args.Args.ConfigFile,
		WorkerPoolSize:   10,
		MaxWorkerTaskLen: 1024,
		MaxMsgChanLen:    1024,
		LogDir:           pwd + "/log",
		LogFile:          "",
		LogDebugClose:    false,
	}
	GlobalObject.Reload()
}
